package com.huatai.exchange.utils;

import com.faneui.common.exception.BusinessException;
import com.faneui.common.utils.CloseUtils;
import com.faneui.common.utils.Constants;
import com.faneui.dbf.utils.DBFUtils;
import com.faneui.dbf.yss.YssDBFUtils;
import com.google.common.collect.Lists;
import com.linuxense.javadbf.DBFField;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class FileDealUtils {

    private static final Logger logger = LoggerFactory.getLogger(FileDealUtils.class);

//    public static String formatStr(String str, Map<String, Object> resvMap) throws BusinessException {
//        return formatStr(str, null, resvMap);
//    }
//
//    public static String formatStr(String str, Map<String, Object> excDataFileMap, Map<String, Object> resvMap) throws BusinessException {
//        if (StringUtils.isBlank(str)) {
//            return str;
//        }
//        logger.info("formatStr before:{}", str);
//        String yyyyMMdd = (String) resvMap.get(Contents.FIELD_YYYYMMDD);
//
//        String tmpStr = str;
//        while (tmpStr.contains("${") && tmpStr.contains("}")) {
//            Integer startNum = tmpStr.indexOf("${") + 2;
//            Integer endNum = tmpStr.indexOf("}");
//            String field = tmpStr.substring(startNum, endNum);
//            logger.info("field:" + field);
//            String value = (String) resvMap.get(field);
//            if (StringUtils.isBlank(value) && excDataFileMap != null) {
//                value = (String) excDataFileMap.get(field);
//            }
//            if (StringUtils.isBlank(value)) {
//                if (Contents.FIELD_ZTMC.equals(field)) {
//                    String ztmc = (String) resvMap.get(Contents.FIELD_ZTMC);
//                    if (StringUtils.isBlank(ztmc))
//                        throw new BusinessException("账套名称必须标记");
//                    value = ztmc;
//                } else if (Contents.FIELD_YYYY_MM_DD.equals(field)) {
//                    if (StringUtils.isBlank(yyyyMMdd))
//                        throw new BusinessException("日期必须标记");
//                    value = yyyyMMdd.substring(0, 4) + "-" + yyyyMMdd.substring(4, 6) + "-" + yyyyMMdd.substring(6);
//                } else if (Contents.FIELD_YYMMDD.equals(field)) {
//                    if (StringUtils.isBlank(yyyyMMdd))
//                        throw new BusinessException("日期必须标记");
//                    value = yyyyMMdd.substring(2);
//                } else if (Contents.FIELD_YYMM.equals(field)) {
//                    if (StringUtils.isBlank(yyyyMMdd))
//                        throw new BusinessException("日期必须标记");
//                    value = yyyyMMdd.substring(2, 6);
//                } else if (Contents.FIELD_YYYY.equals(field)) {
//                    if (StringUtils.isBlank(yyyyMMdd))
//                        throw new BusinessException("日期必须标记");
//                    value = yyyyMMdd.substring(0, 4);
//                } else if (Contents.FIELD_YYYYMM.equals(field)) {
//                    if (StringUtils.isBlank(yyyyMMdd))
//                        throw new BusinessException("日期必须标记");
//                    value = yyyyMMdd.substring(0, 6);
//                } else if (Contents.FIELD_MM_DD.equals(field)) {
//                    if (StringUtils.isBlank(yyyyMMdd))
//                        throw new BusinessException("日期必须标记");
//                    value = yyyyMMdd.substring(4, 6) + "-" + yyyyMMdd.substring(6);
//                } else if (Contents.FIELD_MMDD.equals(field)) {
//                    if (StringUtils.isBlank(yyyyMMdd))
//                        throw new BusinessException("日期必须标记");
//                    value = yyyyMMdd.substring(4);
//                } else if (Contents.FIELD_MCDD.equals(field)) {
//                    value = transferMonth(yyyyMMdd.substring(4, 6)) + yyyyMMdd.substring(6, 8);
//                } else {
//                    return tmpStr;
//                }
//                resvMap.put(field, value);
//            }
//            String oldStr = "${" + field + "}";
//            tmpStr = tmpStr.replace(oldStr, value);
//        }
//        logger.info("formatStr after:{}", tmpStr);
//        return tmpStr;
//    }


    public static void createDBFFile(String isChinese, String filePath, String srcPath, Object[] dbfFields, List<Map<String, Object>> result) throws BusinessException {
        OutputStream os = null;
        try {

            if (Constants.boolean_true.equals(isChinese)) { // 中文处理方式 借鉴 Yss 的程序
                List<Object[]> objectsList = Lists.newArrayList();
//                logger.info("类class："+dbfFields[0].getClass());
//                JDBField[] fields = (JDBField[]) dbfFields;
                for (Map<String, Object> dataMap : result) {
                    //  由于获取中文时是乱码，所以 改用数字进行字段排序
                    // SQL 中 使用 AA 加数字 例如 AA0,AA1 作为结果集
                    Object[] objects = new Object[dbfFields.length];
                    Set<String> keys = dataMap.keySet();
                    for (String key : keys) {
                        if (key.contains("AA")) {
                            Integer index = Integer.valueOf(key.replace("AA", ""));
                            objects[index] = dataMap.get(key);
                        }
                    }
                    objectsList.add(objects);
                }
                YssDBFUtils.createChineseTitleDBFFile(srcPath, filePath, objectsList);
            } else {
                os = new FileOutputStream(filePath);
                List<Object[]> objectsList = Lists.newArrayList();
                DBFField[] fields = new DBFField[dbfFields.length];
                for (int i = 0; i < dbfFields.length; i++) {
                    fields[i] = (DBFField) dbfFields[i];
                }
                for (Map<String, Object> dataMap : result) {
                    List<Object> objects = Lists.newArrayList();
                    for (DBFField field : fields) {
                        objects.add(dataMap.get(field.getName().toUpperCase()));
                    }
                    objectsList.add(objects.toArray());
                }
                DBFUtils.addDBFRecord(os, fields, objectsList);
            }
        } catch (Exception ex) {
            BusinessException.throwBusinessException(ex);
        } finally {
            CloseUtils.safeClose(os);
        }
    }

//    public static String transferMonth(String mm) {
//        String mc = mm;
//        if ("10".equals(mm)) {
//            mc = "a";
//        } else if ("11".equals(mc)) {
//            mc = "b";
//        } else if ("12".equals(mc)) {
//            mc = "c";
//        } else {
//            mc = mc.substring(1);
//        }
//        return mc;
//    }
}
